#include "mod.h"

//global variables
// 系统从开启时钟至今的时间片（10ms）数

u64 jiffies;//核心计时变量,，每次时钟中断（假设每10ms触发一次）递增。
static u32 ClockVector = 0x20;//时钟中断对应的中断向量号（IRQ0映射到0x20）

// static methons

static void clockInterruptHandler(u32 vector);
static void initPIT();
static u16 readCounter0();

//public methods

void InitializeClock() {
    initPIT();   //配置PIT硬件
    SetInterruptHandler(ClockVector, clockInterruptHandler);//注册中断处理函数
    SetInterrupt(ClockVector); //启用PIC的IRQ0中断
    jiffies = 0; //重置计时
    asm volatile("sti"); //开启CPU中断（允许响应中断）
}

static void initPIT() {
    WriteByte(ControlWordRegister,0b00110100);// 00, 11, 010, 0 控制字：通道0，先低后高字节，模式2，二进制计数
    WriteByte(ClockCounter0,ClockMaxCounter & 0XFF); // low byte
    WriteByte(ClockCounter0,ClockMaxCounter >> 8);// high byte
}

static void clockInterruptHandler(u32 vector) {
    Assert(vector == ClockVector); //确保中断向量正确
    jiffies++;  //时间片计数+1
    OuteralInterruptCompleted(vector); //发送EOI信号
    Schedule();
}

//总时间 = 已完成的完整时间片数 × 每片毫秒数 + 当前计数器的剩余计数 × 每个计数点的微秒数。
u32 GetTimeMS() {
    return jiffies * JeffyMS + (ClockMaxCounter - readCounter0()) * (MSPerTick * 1000);
}

static u16 readCounter0() {
    WriteByte(ControlWordRegister, 0b00110100);//锁存当前计数值（模式与初始化一致）
    u8 low = ReadByte(ClockCounter0);           // 读取低字节
    u8 high = ReadByte(ClockCounter0);          // 读取高字节
    return (high << 8) | low;                   // 合并为16位值
}